#pragma once
#include <string>
#include <iostream>
#include <unordered_map>

// 定义消息类型字段宏
namespace rpc
{

#define KEY_METHOD "method"           // 方法
#define KEY_PARAMS "parameters"       // 参数
#define KEY_TOPIC "topic"             // 主题
#define KEY_OPTION_TYPE "option_type" // 操作类型
#define KEY_TOPIC_MSG "topic_msg"     // 主题消息
#define HOST "host"                   // 主机
#define HOST_IP "ip"                  // 主机ip
#define HOST_PORT "port"              // 主机端口
#define KEY_RECODE "recode"           // 返回值
#define kEY_RESULT "result"           // 返回结果

    // 消息类型定义
    enum class MY_TYPE
    {
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };

    // 响应码类型定义
    enum class MY_CODE
    {
        RCODE_OK = 0,            // 成功响应
        RCODE_PARSE_FAILED,      // 解析失败
        RCODE_ERR_MSGTYPE,       // 消息类型错误
        RCODE_INVAILED_MSG,      // 无效消息
        RCODE_DISCONNECT,        // 连接断开
        RCODE_INVAILED_PARAMS,   // 无效参数
        RCODE_NOT_FOUND_SERVICE, // 没找到服务
        RCODE_NOT_FOUND_TOPIC,   // 未找到主题
        RCODE_INVAILED_OPTYPE,   // 错误的操作类型
        RCODE_INTERNAL_ERR       // 内部错误
    };

    // 定义一个调用的接口
    static std::string ERR_RESON(MY_CODE code)
    {
        std::unordered_map<MY_CODE, std::string> map{
            {MY_CODE::RCODE_OK, "成功响应"},
            {MY_CODE::RCODE_PARSE_FAILED, "解析失败"},
            {MY_CODE::RCODE_ERR_MSGTYPE, "消息类型错误"},
            {MY_CODE::RCODE_INVAILED_MSG, "消息错误"},
            {MY_CODE::RCODE_DISCONNECT, "连接断开"},
            {MY_CODE::RCODE_INVAILED_PARAMS, "无效参数"},
            {MY_CODE::RCODE_NOT_FOUND_SERVICE, "未找到服务"},
            {MY_CODE::RCODE_NOT_FOUND_TOPIC, "未找到主题"},
            {MY_CODE::RCODE_INVAILED_OPTYPE, "错误的操作类型"},
            {MY_CODE::RCODE_INTERNAL_ERR, "内部错误"}};

        auto it = map.find(code);
        std::string ret;
        if (it == map.end())
        {
            ret = "未知错误";
        }
        else
        {
            ret = it->second;
        }

        return ret;
    };

    // rpc请求类型
    enum class RPC_REQ
    {
        ASYNC = 0, // 异步请求
        SYNC,      // 同步请求
        CBACK      // 回调请求
    };

    // 主题操作类型定义
    enum class TOPIC_OPTION
    {
        TOPIC_CREATE = 0, // 主题创建
        TOPIC_REMOVE,     // 主题删除
        TOPIC_SUBSCRIBE,  // 主题订阅
        TOPIC_CANCEL,     // 取消订阅
        TOPIC_PUBLISH     // 主题发布
    };

    // 服务类型定义
    enum class SERVICE_TYPE
    {
        SERVICE_ONLINE = 0, // 服务上线
        SERVICE_OFFLINE,    // 服务下线
        SERVICE_REGISTRY,   // 服务注册
        SERVICE_DISCOVERY,  // 服务发现
        SERVICE_UNKNOW      // 未知服务
    };
}

 
 